package com.binhthuan.catechist.server.domain;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import com.google.gson.annotations.Expose;

/**
 * @author Giang Đinh - Bảng điểm danh lớp, tương ứng với bảng
 *         <b>ec_attendance_list</b> trong cơ sở dữ liệu.
 */
@Entity
@Table(name="ec_attendance_list")
public class AttendanceList extends AbstractObject {
    
    /**
     * Mã bảng điểm danh.
     */
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    @Expose
    private Integer id;
    
    /**
     * Lớp.
     */
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    @JoinColumn(name="course_id")
    @Expose
    private Course course;
    
    /**
     * Ngày học.
     */
    @JoinColumn(name="attendance_date")
    @Expose
    private Date attendanceDate;
    
    /**
     * Ghi chú.
     */
    @Column(name="comment", length=255)
    @Expose
    private String comment;
    
    /**
     * Người tạo.
     */
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    @JoinColumn(name="create_person_id")
    @Expose
    private Trainer createPerson;
    
    /**
     * Ngày tạo.
     */
    @Column(name="create_date")
    @Expose
    private Date createTime;
    
    /**
     * Danh sách điểm danh.
     */
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "attendanceList", fetch = FetchType.LAZY)
    private Set<AttendanceDetail> attendanceDetails;

    public AttendanceList() {
        attendanceDetails = new HashSet<AttendanceDetail>(0);
    }
    
    /**
     * Lấy mã sổ điểm danh.
     * @return Mã sổ điểm danh.
     */
    public Integer getId() {
        return id;
    }

    /**
     * Gán mã sổ điểm danh.
     * @param id
     *            Mã sổ điểm danh.
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Lấy lớp học.
     * @return Lớp học.
     */
    public Course getCourse() {
        return course;
    }

    /**
     * Gán lớp học.
     * @param course
     *            Lớp học.
     */
    public void setCourse(Course course) {
        this.course = course;
    }

    /**
     * Lấy ngày học.
     * @return Ngày học.
     */
    public Date getAttendanceDate() {
        return attendanceDate;
    }

    /**
     * Gán ngày học.
     * @param attendanceDate
     *            Ngày học.
     */
    public void setAttendanceDate(Date attendanceDate) {
        this.attendanceDate = attendanceDate;
    }

    /**
     * Lấy ghi chú.
     * @return Ghi chú.
     */
    public String getComment() {
        return comment;
    }

    /**
     * Gán ghi chú.
     * @param comment
     *            Ghi chú.
     */
    public void setComment(String comment) {
        this.comment = comment;
    }

    /**
     * Lấy người tạo.
     * @return Người tạo
     */
    public Trainer getCreatePerson() {
        return createPerson;
    }

    /**
     * Gán người tạo.
     * @param createPerson 
     *            Người tạo.
     */
    public void setCreatePerson(Trainer createPerson) {
        this.createPerson = createPerson;
    }

    /**
     * Lấy thời gian tạo sổ điểm danh.
     * @return Thời gian tạo sổ điểm danh.
     */
    public Date getCreateTime() {
        return createTime;
    }

    /**
     * Gán Thời gian tạo sổ điểm danh.
     * @param createTime 
     *            Thời gian tạo sổ điểm danh.
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * @return the attendanceDetails
     */
    public Set<AttendanceDetail> getAttendanceDetails() {
        return attendanceDetails;
    }

    /**
     * @param attendanceDetails the attendanceDetails to set
     */
    public void setAttendanceDetails(Set<AttendanceDetail> attendanceDetails) {
        this.attendanceDetails = attendanceDetails;
    }
}
